# -*- coding: utf-8 -*-
import colore, time, pickle
conto_cambiamenti = 0       #contatore che conta il numero di volte che cambio il font (nella stessa esecuzione)
font_temp = 0               #contatore che memorizza la posizione dell'ultimo font selezionato
esecuzione = 0              #valore che controlla se l'esecuzione del cambiamento del font e' la prima o no

def associazione(n, dip, a=255):
    """Ritorna il codice corrispondente al colore associato alla materia"""
    if a<0 or a>255:
        raise colore.ColorError("Invalid alpha value: %d" % a)
    n = n.lower()
    if dip == "dip0":
        if n not in AssBackMat.association_chimica.keys():
            c = colore.Color.hexcode["white"]
            return "#" + hex(a+256)[-2:] + c
        b = AssBackMat.association_chimica[n]
    elif dip == "dip1":
        if n not in AssBackMat.association_informatica.keys():
            c = colore.Color.hexcode["white"]
            return "#" + hex(a+256)[-2:] + c
        b = AssBackMat.association_informatica[n]
    elif dip == "dip2":
        if n not in AssBackMat.association_matematica.keys():
            c = colore.Color.hexcode["white"]
            return "#" + hex(a+256)[-2:] + c
        b = AssBackMat.association_matematica[n]
    elif dip == "dip3":
        if n not in AssBackMat.association_scienze_ambientali.keys():
            c = colore.Color.hexcode["white"]
            return "#" + hex(a+256)[-2:] + c
        b = AssBackMat.association_scienze_ambientali[n]
    else:
        if n not in AssBackMat.association_scienze_biologiche.keys():
            c = colore.Color.hexcode["white"]
            return "#" + hex(a+256)[-2:] + c
        b = AssBackMat.association_scienze_biologiche[n]
    c = colore.Color.hexcode[b]
    return "#" + hex(a+256)[-2:] + c


class Attributi:
    
    frase_vuota = ""
    frase_iniziale = "CORSI DI LAUREA"
    frase_uscita = "ESCI"
    frase_personalizzato = "PERSONALIZZATO"
    frase_scelta = "MENU' SCELTA MATERIE"
    frase_anno_triennale = "LT - %s ANNO"
    frase_anno_triennale2 = "LT %s"
    frase_anno_magistrale = "LM - %s ANNO"
    frase_anno_magistrale2 = "LM %s"
    frase_terzo_anno= "LT - III ANNO"
    frase_terzo_anno2 = "LT III"
    text_style = "bold"
    gravity = "center"
    
    def grandezza_scrittura(self, i):
        if i == 1:
            return "15dp"
        elif i == 2:
            return "12dp"
        elif i == 3:
            return "10dp" 
        return "8dp"

    def scelta_grandezza_scrittura(self, mf):
        if mf != "" or mf == "nothing":
            return mf
        else:
            return "15dp"
            
    def scelta_font(self, droid, font_cambiato, cambiato):
        global conto_cambiamenti, font_temp, esecuzione
        cont = 0
        lista_font = ["8dp","10dp","12dp","15dp","18dp","20dp","22dp","24dp","26dp","28dp","30dp"]
        d = Dialogo()
        if cambiato == 1 and esecuzione == 0:
            for i in lista_font:
                if i != font_cambiato:
                    cont += 1
                else:
                    break
            font_scelto = cont
            esecuzione += 1
            cont = 0
        else:
            if conto_cambiamenti == 0:
                font_scelto = 3
            elif conto_cambiamenti != 0:
                font_scelto = font_temp
        while True:
            ris = d.dialoghi(droid, d.frase11, d.frase5, d.frase6, 3, lista_font, font_scelto)
            if ris['which']=='positive':
                conto_cambiamenti += 1
                r = droid.dialogGetSelectedItems().result
                font_temp = r[0]
                return lista_font[r[0]]
            elif ris['which']=='negative':
                droid.makeToast(Stampe.stampa6)
                return "nothing"
        
    def testo_ore(self, i):
        if i == 1:
            return "09\n11"
        elif i == 2:
            return "11\n13"
        elif i == 3:
            return "14\n16"
        return "16\n18"

    def testo_finale(self, i):
        if i == 0:
            return "RITORNA"
        else:
            return "ESCI"
    
    def testo_finale2(self, i):
        if i == 0:
            return "RITORNA"
        else:
            return "GENERA"

    def testo_corso_laurea(self, i):
        if i == "dip0":
            return "CHIMICA"
        elif i == "dip1":
            return "INFORMATICA"
        elif i == "dip2":
            return "MATEMATICA"
        elif i == "dip3":
            return "SCIENZE AMBIENTALI"
        return "SCIENZE BIOLOGICHE"
    
    def background_giorni(self, l):
        if l == "Lu":
            return "black"
        elif l == "Ma":
            return "blue"
        elif l == "Me":
            return "green"
        elif l == "Gi":
            return "gray"
        return "red"


class AssBackMat:

    association_chimica = {
      "matematica ii":"teal",
      "chimica organica i: chimica organica i":"slategray",
      "chimica organica i: laboratorio di chimica organica i":"seashell",
      "inglese":"peru",
      "chimica analitica i: chimica analitica i e chemiometria":"silver",
      "chimica fisica i: laboratorio di chimica fisica i":"tan",
      "complementi di chimica ii":"rosybrown",
      "fondamenti di biologia e biochimica":"orchid",
      "chimica analitica i: laboratorio di chimica analitica i":"orange",
      "chimica organica ii: laboratorio di chimica organica ii":"orangered",
      "proprietÀ chimico-biologiche e qualitÀ degli alimenti":"papayawhip",
      "chimica inorganica: chimica inorganica":"magenta",
      "chimica inorganica: laboratorio di chimica inorganica":"snow",
      "tecniche analitiche avanzate":"deeppink",
      "catalisi":"crimson",
      "chimica bioorganica":"maroon",
      "spettroscopie ottiche":"mediumturquoise",
      "laboratorio di chimica bioorganica":"azure",
      "laboratorio di chimica analitica ambientale":"violet",
      "chimica fisica ambientale: laboratorio di chimica fisica ambientale":"honeydew",
      "elettrochimica inorganica":"darkred",
      "strutturistica chimica":"lime",
      "chimica fisica dei materiali":"mintcream"
      }
    
    association_informatica = {
      "fisica":"red",
      "architettura degli elaboratori: architettura 2":"yellow",
      "programmazione 2: sperimentazioni":"green",
      "tecniche di comunicazione e scrittura":"purple",
      "programmazione 2: fondamenti":"blueviolet",
      "inglese":"sienna",
      "reti 1":"tomato",
      "sistemi operativi 2":"royalblue",
      "algoritmi 2: fondamenti":"indigo",
      "algoritmi 2: sperimentazioni":"salmon",
      "calcolo delle probabilitÀ e statistica: calcolo delle probabilitÀ":"teal",
      "logica computazionale":"slategray",
      "ingegneria del software":"snow",
      "fondamenti, linguaggi e traduttori 2":"deeppink",
      "metodologie di programmazione per il web: fondamenti":"crimson",
      "metodologie di programmazione per il web: sperimentazione":"maroon",
      "sicurezza":"mediumturquoise",
      "rappresentazione della conoscenza e logica computazionale: fondamenti":"azure",
      "rappresentazione della conoscenza e logica computazionale: programmazione a vincoli":"aliceblue",
      "sistemi multimediali":"violet",
      "matematica computazionale":"honeydew",
      "business intelligence: supporto alle decisioni aziendali":"lightgoldenrodyellow",
      "applicazioni web: linguaggi":"sandybrown",
      "applicazioni web: architetture":"turquoise",
      "sistemi distribuiti: sistemi distribuiti 1":"darkred",
      "sistemi distribuiti: sistemi distribuiti 2":"bisque"
      }
    
    association_matematica = {
      "analisi funzionale":"red",
      "struttura della materia i":"yellow",
      "relativitÀ":"green",
      "fondamenti di probabilitÀ e statistica i":"purple",
      "matematica finanziaria":"blueviolet",
      "probabilitÀ":"sienna",
      "matematica computazionale":"tomato",
      "matematiche complementari: matematiche complementari a":"royalblue",
      "matematiche complementari: matematiche complementari b":"indigo",
      "didattica della matematica":"salmon"
      }
    
    association_scienze_ambientali = {
      "chimica organica":"red",
      "geologia: geologia":"yellow",
      "statistica":"blue",
      "geologia: geologia applicata":"green",
      "inglese":"violet",
      "fisiologia ambientale delle piante":"indianred",
      "elementi di diritto pubblico e di diritto ambientale: diritto ambientale":"lightyellow",
      "elementi di diritto pubblico e di diritto ambientale: diritto pubblico":"mediumslateblue",
      "elementi di fisica":"fuchsia",
      "biologia cellulare":"forestgreen",
      "botanica":"firebrick",
      "gis":"lavender",
      "chimica analitica e laboratorio strumentale: chimica analitica":"lawngreen",
      "chimica analitica e laboratorio strumentale: laboratorio di chimica strumentale":"lemonchiffon",
      "analisi del rischio ecologico":"darkorchid",
      "chimica inorganica ambientale":"darksalmon",
      "sistemi di monitoraggio":"whitesmoke",
      "evoluzione biologica":"springgreen",
      "mineralogia ambientale":"thistle",
      }
    
    association_scienze_biologiche = {
      "chimica organica":"navy",
      "genetica i":"oldlace",
      "zoologia i":"olive",
      "fondamenti di istologia, embriologia e anatomia funzionale":"lemonchiffon",
      "fisica":"indigo",
      "inglese":"khaki",
      "biologia molecolare i":"red",
      "microbiologia generale":"yellow",
      "principi di biochimica: (b)":"green",
      "botanica generale":"blue",
      "igiene":"darkblue",
      "biologia del differenziamento":"darkcyan",
      "tecniche di microscopia elettronica":"darkgoldenrod",
      "fisiologia generale":"darkgray",
      "fondamenti di patologia generale e immunologia":"darkgreen",
      "biologia computazionale":"darkorange",
      "ecologia animale":"aqua",
      "etologia":"beige",
      "genetica ii":"brown",
      "neurofisiologia":"coral",
      "patologia generale ii":"chocolate",
      "botanica generale ii":"hotpink",
      "microbiologia agro-ambientale":"linen",
      "biologia molecolare ii":"moccasin",
      "zoologia applicata":"plum",
      "biologia applicata":"mistyrose",
      "biochimica applicata":"gainsboro"
      }
    

    
class AssDipURL:
    
    url_dip = {
        "lt1dip0":"http://orari.disit.unipmn.it/current/cdl/4.html",
        "lt2dip0":"http://orari.disit.unipmn.it/current/cdl/5.html",
        "lt3dip0":"http://orari.disit.unipmn.it/current/cdl/6.html",
        "lm1dip0":"http://orari.disit.unipmn.it/current/cdl/70.html",
        "lm2dip0":"http://orari.disit.unipmn.it/current/cdl/71.html",
        "lt1dip1":"http://orari.disit.unipmn.it/current/cdl/10.html",
        "lt2dip1":"http://orari.disit.unipmn.it/current/cdl/11.html",
        "lt3dip1":"http://orari.disit.unipmn.it/current/cdl/12.html",
        "lm1dip1":"http://orari.disit.unipmn.it/current/cdl/72.html",
        "lm2dip1":"http://orari.disit.unipmn.it/current/cdl/80.html",
        "lt3dip2":"http://orari.disit.unipmn.it/current/cdl/15.html",
        "lt1dip3":"http://orari.disit.unipmn.it/current/cdl/16.html",
        "lt2dip3":"http://orari.disit.unipmn.it/current/cdl/17.html",
        "lt3dip3":"http://orari.disit.unipmn.it/current/cdl/18.html",
        "lt1dip4":"http://orari.disit.unipmn.it/current/cdl/68.html",
        "lt2dip4":"http://orari.disit.unipmn.it/current/cdl/75.html",
        "lt3dip4":"http://orari.disit.unipmn.it/current/cdl/82.html",
        "lm1dip4":"http://orari.disit.unipmn.it/current/cdl/69.html",
        "lm2dip4":"http://orari.disit.unipmn.it/current/cdl/76.html"
        }


class Dialogo:
    
    frase1 = "Rete Non Trovata!"
    frase2 = "Esci"
    frase3 = "Continua"
    frase4 = "ELENCO CORSI"
    frase5 = "ANNULLA"
    frase6 = "OK"
    frase7 = "Vuoi rivedere l'orario gia' scelto con le materie:"
    frase8 = "No"
    frase9 = "Si"
    frase10 = "Vuoi creare un orario nuovo?"
    frase11 = "Scegli la grandezza delle scritte:"
    frase12 = "Indietro"
    frase13 = "Avanti"
    frase14 = "AIUTO"
    frasevuota = ""
    
    hash_Dialogo = {
        0:"Benvenuto nella mini guida dell'applicazione orari",
        1:"Nella schermata iniziale puoi scegliere il corso di laurea (e ti compare la schermata del corso scelto)",
        2:"Nella schermata con il corso puoi scegliere uno degli orari classici (e ti compare così la schermata del l'orario classico scelto) oppure l'orario personalizzato (e ti compare la schermata dell'orario personalizzato)",
        3:"Se presente, viene chiesto di vedere un orario presonalizzato già creato in precedenza (e decidi cosa fare se rivederlo o no), altrimenti puoi scegliere l'anno (o gli anni) contenente le materie da inserire nell'orario",
        4:"Cliccando su genera su genera l'orario personalizzato",
        5:"Nella schermata dell'orario (generata tramite scelta di un orario classico oppure tramite un orario personalizzato oppure ancora tramite un orario personalizzato già esistente) puoi cliccare sugli slot per vedere i dettagli per ogni singola materia presente in una determinata ora",
        6:"Da questi slot puoi continuare a navigare negli orari cliccando su uno dei dettagli dello slot (e ti compare un nuovo orario relativo al dettaglio cliccato da cui puoi di nuovo cliccare su uno slot e continuare a navigare)"
        }

    def dialoghi(self, droid, messaggio, bottone1, bottone2, extra, lista, temp):
        droid.dialogCreateAlert(messaggio)
        if extra == 1:
            droid.dialogSetMultiChoiceItems(lista, temp)
        elif extra == 2:
            droid.dialogSetItems(lista)
        elif extra == 3:
            droid.dialogSetSingleChoiceItems(lista, temp)
        droid.dialogSetNegativeButtonText(bottone1)
        droid.dialogSetPositiveButtonText(bottone2)
        droid.dialogShow()
        r = droid.dialogGetResponse().result
        return r
    
    def Dialogo_menu_aiuto(self, droid):
        cont = 0
        while True:
            droid.dialogCreateAlert(Dialogo.frase14,Dialogo.hash_Dialogo[cont])
            if cont != 0:
                droid.dialogSetNegativeButtonText(Dialogo.frase12)
            if cont != 6:
                droid.dialogSetPositiveButtonText(Dialogo.frase13)
            droid.dialogSetNeutralButtonText(Dialogo.frase2)
            droid.dialogShow()
            r = droid.dialogGetResponse().result
            if r["which"] == "positive":
                cont += 1
            elif r["which"] == "negative":
                cont -= 1
            elif r["which"] == "neutral":
                break
        return


class ErroreFormato(Exception): #classe che gestisce gli errori durante i parse
    pass


class GestioneFile:
    
    file_cambiamenti = "cambiamenti"

    def lettura_file(self, dip):
        miofile = open(dip,"r")
        out = pickle.load(miofile)
        miofile.close()
        return out

    def scrittura_file(self, ris, dip):
        miofile = open(dip,"w")
        pickle.dump(ris,miofile)
        miofile.close()

    def cancellazione_file(self, dip):
        miofile = open(dip,"w")
        miofile.close()


class Indirizzo:
    ind = "http://orari.disit.unipmn.it/current"


class Inizializzazione:
    
    def recupero_informazioni_corso_laurea(self, dip):
        glob = Inizializzazione()
        g = glob.inizializzazione_hash_global()
        return g[dip]

    def inizializzazione_hash_global(self):
        global_association = {}
        global_association["dip0"] = AssBackMat.association_chimica.items()
        global_association["dip1"] = AssBackMat.association_informatica.items()
        global_association["dip2"] = AssBackMat.association_matematica.items()
        global_association["dip3"] = AssBackMat.association_scienze_ambientali.items()
        global_association["dip4"] = AssBackMat.association_scienze_biologiche.items()
        return global_association


class Menu:
    
    def creazione_menu_opzionale(self, droid):
        droid.addOptionsMenuItem("Cambia Font","font",None,"ic_menu_edit") #opzione cambiamento font
        droid.addOptionsMenuItem("Cambia Corso Laurea","corso",None,"ic_input_get") #opzione cambiamento corso di laurea
        droid.addOptionsMenuItem("Help","help",None,"ic_menu_help") #opzione spiegazione
        droid.addOptionsMenuItem("Chiudi","off",None,"ic_menu_revert") #opzione chiusura menu opzionale

class Stampe:
    
    stampa1 = "Premi Continua o Esci"
    stampa2 = "Premi Continua o Ok"
    stampa3 = "Premi Si o No"
    stampa4 = "Non e' stata trovata alcuna materia gia' caricata, oppure il file non esiste"
    stampa5 = "Non e' stata scelta alcuna materia"
    stampa6 = "Il font non e' cambiato"
    stampa7 = "PREMI SOLO UNO DEI BOTTONI DEL MENU"
    stampa8 = "Schermata adattata"
    
    def messaggio_formato(self, droid):
        droid.makeToast('Formato HTML non riconosciuto')
        time.sleep(1)
        droid.makeToast('Applicazione terminata!')
        time.sleep(1)